package main

import (
	"fmt"
	"strings"
)

type myFunc2 func(int) bool

func main() {
	str := "asdfasdGJGKSD"
	//str = processLetter(str)
	//println(str)
	println(StringToCase(str, processLetter))
	println(StringToCase2(str, processLetter))
	arr := []int{1, 23, 4, 6, 7, 234, 5, 1, 565, 3, 54}
	fmt.Println(arr)
	odd := Filter(arr, isOdd)
	fmt.Println(odd)
	even := Filter(arr, isEven)
	fmt.Println("even", even)
	//	theme 匿名函数
	func(data int) {
		fmt.Println("这是1", data)
	}(98) // 直接调用
	result := func(data int) int {
		return data
	}(250)
	fmt.Println("这是有参的匿名函数", result)
	myfunc3 := func(data string) string { return data }
	fmt.Println(myfunc3("欢迎学习go语言,这是可以传参"))
}

// 实现大写小写奇偶交替
func processLetter(str string) string {
	result := ""
	for i, value := range str {
		if i%2 == 0 {
			result += strings.ToUpper(string(value))
		} else {
			result += strings.ToLower(string(value))
		}
	}
	return result
}

//调用函数
func StringToCase(str string, myfunc func(string) string) string {
	return myfunc(str)
}

//使用type ,来使 func(string) string 变得简单,起一个别名,一般放在前面
type caseFunc func(string) string

func StringToCase2(str string, myfunc caseFunc) string {
	return myfunc(str)
}

//判断奇偶
func isEven(num int) bool {
	if num%2 == 0 {
		return true
	}
	return false
}
func isOdd(num int) bool {
	if num%2 == 0 {
		return false
	}
	return true
}

//根据函数来处理切片,实现奇偶数分组,返回新的切片
func Filter(arr []int, f myFunc2) []int {
	var result []int
	for _, value := range arr {
		if f(value) {
			result = append(result, value)
		}
	}
	return result
}

/*
theme functions
	func 函数名 (参数列表) (返回参数列表){
	//	函数体
	//	参数列表 (a, b int)
	//	返回值,可以是多个,可是是只有名字列表,也可是只有数据类型列表,也可以都有
	//	参数列表中,定义的变量名也可以当做是,局部变量,在函数内部使用,如果返回列表加上了返回值的名字,那么return时,可以不用加名字
	}

theme 函数变量
	1.定义一个函数类型
	2.实现定义函数类型
	3.作为参数调用
theme 匿名函数
	没有函数名,多用于回调函数,闭包,
	func (参数列表) (返回参数列表){
	// 函数体
	}
*/
